const express = require('express')
const bodyParser = require('body-parser')
const managerRouter = require('./routes/manager')
const advertRouter = require('./routes/advert')
const captchaRouter = require('./routes/captcha')
const courseRouter = require('./routes/course')
const categoryRouter = require('./routes/category')
const commonRouter = require('./routes/common')
const session = require('express-session')
const config = require('./config')
const MongoStore = require('connect-mongo')(session)

const app = express()

app.use('/api/uploads', express.static(config.uploadDir))

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

// 配置 Session 中间件
// 建议：把这些第三方的通用的中间件，按照你的需求写在其它处理中间件之前
// 如果第一次请求过来没有那个钥匙 Cookie，则直接在本次响应报文中加入 钥匙：connect.sid
// https://github.com/jdesboeufs/connect-mongo
// 只要经过以下配置，Session 数据的读写就都基于 mongodb 数据库了
// 进程外 Session 好处:
//  1. Session 数据可以持久化了，服务器的崩溃和重启不会导致 Session 数据丢失
//  2. 可以在多个服务实例之间共享 Session 数据
app.use(session({
  secret: config.sessionSecret,
  resave: false,
  saveUninitialized: true,
  store: new MongoStore({ url: 'mongodb://localhost/edu' })
}))

app.use('/api', (req, res, next) => {
  if (req.path === '/managers/login' || req.path === '/captcha') {
    return next()
  }
  if (!req.session.manager) {
    return res.json({
      success: false,
      err_code: 403,
      err_message: '没有操作权限'
    })
  }
  next()
})

app.use('/api', advertRouter)
app.use('/api', managerRouter)
app.use('/api', captchaRouter)
app.use('/api', courseRouter)
app.use('/api', categoryRouter)
app.use('/api', commonRouter)


// 全局错误统一处理中间件
// 默认肯定不会执行
// 只有在他之前的某一个中间件中调用 next 的时候，传递了参数，那这个中间件就会把传递了参数的 next 指向自己
app.use((err, req, res, next) => {
  res.json({
    success: false,
    err_code: 500,
    err_message: err.message
  })
})

app.listen(3000, () => {
  console.log('running...')
})
